package com.rejuvee.myloginapplication.ui.login.vm;

import android.util.Patterns;

import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

import com.rejuvee.myloginapplication.R;
import com.rejuvee.myloginapplication.data.LoginRepository;
import com.rejuvee.myloginapplication.data.Result;
import com.rejuvee.myloginapplication.data.model.LoggedInUser;
import com.rejuvee.myloginapplication.data.model.LoggedInUserView;
import com.rejuvee.myloginapplication.ui.login.LoginFormState;
import com.rejuvee.myloginapplication.ui.login.LoginResult;

/**
 * 登陆界面相关的 视图模型
 * <p>
 * 有关生命周期感知型组件MutableLiveData，参考README.md
 */
public class LoginViewModel extends ViewModel {

    /**
     * 生命周期感知型组件-表单验证状态
     */
    private final MutableLiveData<LoginFormState> loginFormState = new MutableLiveData<>();
    /**
     * 生命周期感知型组件-登录结果
     */
    private final MutableLiveData<LoginResult> loginResult = new MutableLiveData<>();
    /**
     * 远程数据源持有器
     */
    private final LoginRepository loginRepository;

    /**
     * 构造器
     *
     * @param loginRepository 资源存储器，可以是本地数据库，也可以是网络数据库
     */
    LoginViewModel(LoginRepository loginRepository) {
        this.loginRepository = loginRepository;
    }

    public LiveData<LoginFormState> getLoginFormState() {
        return loginFormState;
    }

    public LiveData<LoginResult> getLoginResult() {
        return loginResult;
    }

    /**
     * 调用远程数据源持有器，进行登录
     *
     * @param username 账号
     * @param password 密码
     */
    public void login(String username, String password) {
        // 调用远程数据源持有器，进行登录
        Result<LoggedInUser> result = loginRepository.login(username, password);
        // 判断远程登录的结果
        if (result instanceof Result.Success) {
            // 登陆成功的处理:
            LoggedInUser data = ((Result.Success<LoggedInUser>) result).getData();
            // （LoginActivity中的loginResult.observe将被触发）
            loginResult.setValue(new LoginResult(
                    /* 去除敏感数据 LoggedInUser 转换成 LoggedInUserView */
                    new LoggedInUserView(data.getDisplayName(), data.getAge())));
        } else {
            // 登陆失败的处理:
            // （LoginActivity中的loginResult.observe将被触发）
            loginResult.setValue(new LoginResult(R.string.login_failed));
        }
    }

    /**
     * 输入框变化时，进行表单效验
     *
     * @param username 账号
     * @param password 密码
     */
    public void loginDataChanged(String username, String password) {
        if (!isUserNameValid(username)) {//效验帐号
            // 用户名验证不通过，设置错误提示信息（LoginActivity中的loginFormState.observe将被触发）
            loginFormState.setValue(new LoginFormState(R.string.invalid_username, null));
        } else if (!isPasswordValid(password)) {//效验密码
            // 密码验证不通过，设置错误提示信息（LoginActivity中的loginFormState.observe将被触发）
            loginFormState.setValue(new LoginFormState(null, R.string.invalid_password));
        } else {
            // 验证都通过，设置验证状态为true（LoginActivity中的loginFormState.observe将被触发）
            loginFormState.setValue(new LoginFormState());
        }
    }

    /**
     * 账号格式验证检查
     *
     * @param username 账号
     * @return true 验证通过
     * false 验证不通过
     */
    private boolean isUserNameValid(String username) {
        if (username == null) {
            // null直接返回不通过
            return false;
        }
        // 1正则表达式检查-用户名包含@符号
        if (username.contains("@")) {
            //进行邮箱格式效验
            return Patterns.EMAIL_ADDRESS.matcher(username).matches();
        } else {// 2正则表达式检查-用户名不包含@符号
            //否则 判断是否为空字符串
            return !username.trim().isEmpty();
        }
    }

    /**
     * 密码格式验证检查
     *
     * @param password 密码
     * @return true 验证通过
     * false 验证不通过
     */
    private boolean isPasswordValid(String password) {
        // 密码为null 或者小于5位字符 则密码验证不通过
        return password != null && password.trim().length() > 5;
    }
}